/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package restaurante.cci;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import restaurante.cdp.ClienteDomiciliar;
import restaurante.cdp.Mesa;
import restaurante.cdp.interfaces.Pedinte;
import restaurante.cgt.AplControleCliente;
import restaurante.cih.JanFormularioClienteDomiciliar;
import restaurante.cih.JanFormularioMesa;
import restaurante.cih.JanRelatorioCliente;
import restaurante.util.Rest.tipo;

/**
 *
 * @author Gabriel
 */
public class CtrlCliente {
    
    private AplControleCliente aplControleCliente = AplControleCliente.getInstance();
    private static JanFormularioMesa janFormularioMesa;
    private static JanFormularioClienteDomiciliar janFormularioClienteDomiciliar;
    private static JanRelatorioCliente janRelatorioCliente;
    
     private static CtrlCliente instance;
   

    private CtrlCliente() {
    }

    /**
     * Obtém uma instância da aplicação. Implementação do padrão Singleton.
     */
    public static CtrlCliente getInstance() {
        if (instance == null) {
            instance = new CtrlCliente();
            try {
                janFormularioMesa = JanFormularioMesa.getInstance();
                janFormularioClienteDomiciliar = JanFormularioClienteDomiciliar.getInstance();
                janRelatorioCliente = JanRelatorioCliente.getInstance();
            } catch (Exception ex) {
                System.err.println(ex);
            }
        }
        return instance;
    }
    
    /**
     * Inclui uma mesa
     * @param componentes
     * @return A mesa cadastrada
     */
    public Mesa incluirMesa(List componentes)
    {
        try {
            System.out.println("CtrlCliente - incluirMesa(List componentes)");
            return aplControleCliente.incluirMesa(componentes);
        } 
        catch (Exception ex) {
            System.err.println(ex);
            return null;
        }
    }
    
    /**
     * Altera um mesa
     * @param componentes
     * @param mesa 
     */
    public void alterarMesa(List componentes, Mesa mesa)
    {
        try {
            System.out.println("CtrlCliente - alterarMesa(List componentes)");
            aplControleCliente.alterarMesa(componentes, mesa);
        } 
        catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }

    /**
     * Obtem todas as mesas cadastradas
     * @return Uma lista com as mesas
     */
    public List<Mesa> obterMesas() {
        try {
            System.out.println("CtrlCliente - obterMesa()");
            return aplControleCliente.obterMesas();
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
            return null;

        }
    }
    
    /**
     * Exclui uma mesa
     * @param mesa 
     */
    public void excluirMesa(Mesa mesa)
    {
        try {
             System.out.println("CtrlCliente - excluirMesa(Mesa mesa)");
            aplControleCliente.apagarMesa(mesa);
        } 
        catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }
    
    /**
     * Remove uma mesa da lista de mesas e da um refresh na tela
     * @param selectedRow 
     */
    public void acaoExcluirMesa(int selectedRow) {
        System.out.println("CtrlCliente - acaoexcluirMesa(int selectedRow)");
        excluirMesa(janFormularioMesa.getListMesa().get(selectedRow)); 
        janFormularioMesa.getListMesa().remove(selectedRow);
    }

    /**
     * Abre a janela de formulario da mesa para incluir uma nova mesa
     */
    public void abrirIncluirFormularioMesa() {
        System.out.println("CtrlCliente - abrirIncluirFormularioMesa()");
        janFormularioMesa.setMODO(tipo.INCLUIR);
        janFormularioMesa.acaoIncluir();
        janFormularioMesa.setVisible(true);
    }
    
    /**
     * Abre a janela de formulario da mesa para alterar uma mesa
     * @param linhaSelecionada 
     */
    public void abrirAlterarFormularioMesa(int linhaSelecionada) {
        System.out.println("CtrlCliente - abrirAlterarFormularioMesa()");
        janFormularioMesa.setMODO(tipo.ALTERAR);
        janFormularioMesa.acaoAlterar(linhaSelecionada);
        janFormularioMesa.setVisible(true);
    }
    
    /**
     * Abre a janela de formulario da mesa para consulta uma mesa
     * @param linhaSelecionada 
     */
    public void abrirConsultarFormularioMesa(int linhaSelecionada) {
        System.out.println("CtrlCliente - abrirConsultarFormularioMesa()");
        janFormularioMesa.acaoConsultar(linhaSelecionada);
        janFormularioMesa.setVisible(true); 
    }
    
    /**
     * Atualiza os dados das mesas na lista da janela de eventos mesa
     * @param t
     * @param qtd 
     */
    public void dadosMesa(TableModel t, int qtd) {
        for (int i = 0; i < qtd; i++) {
            ((DefaultTableModel) t).removeRow(0);
        }

        try {
            System.out.println("CtrlCliente - dadosMesa(TableModel t, int qtd)");
            janFormularioMesa.setListMesa(obterMesas());
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
        if (janFormularioMesa.getListMesa() != null) {
            for (Mesa m : janFormularioMesa.getListMesa()) {
                Integer num = m.getPedidosEspera().size();
                ((DefaultTableModel) t).addRow(new Object[]{m.getNumero().toString(), m.getSituacao().toString(),num.toString()});
            }
        }
    }
    
    /**
     * Inclui um cliente domiciliar
     * @param componentes
     * @return O cliente docmicliar cadastrado
     */
    public ClienteDomiciliar incluirClienteDomiciliar(List componentes)
    {
        try {
            System.out.println("CtrlCliente - incluirClienteDomiciliar(List componentes)");
            return aplControleCliente.incluirClienteDomiciliar(componentes);
        } 
        catch (Exception ex) {
            System.err.println(ex);
            return null;
        }
    }
    
    /**
     * Altera um cliente domiciliar
     * @param componentes
     * @param clienteDomiciliar 
     */
    public void alterarClienteDomiciliar(List componentes, ClienteDomiciliar clienteDomiciliar)
    {
        try {
            System.out.println("CtrlCliente - alterarClienteDomiciliar(List componentes, ClienteDomiciliar clienteDomiciliar)");
            aplControleCliente.alterarClienteDomiciliar(componentes, clienteDomiciliar);
        } 
        catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }

    /**
     * Obtem todos os clientes domiciliares cadastrados
     * @return Uma lista com os cliente domiciliares
     */
    public List<ClienteDomiciliar> obterClienteDomiciliares() {
        try {
            System.out.println("CtrlCliente - obterClienteDomiciliar()");
            return aplControleCliente.obterClienteDomiciliares();
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
            return null;

        }
    }
    
    /**
     * Exclui um cliente domiciliar
     * @param clienteDomiciliar 
     */
    public void excluirClienteDomiciliar(ClienteDomiciliar clienteDomiciliar)
    {
        try {
            System.out.println("CtrlCliente - excluirClienteDomiciliar(ClienteDomiciliar clienteDomiciliar)");
            aplControleCliente.apagarClienteDomiciliar(clienteDomiciliar);
        } 
        catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }
    
    /**
     * Exclui um cliente domiciliar da lista de clientes
     * @param selectedRow 
     */
    public void acaoExcluirClienteDomiciliar(int selectedRow) {
        System.out.println("CtrlCliente - acaoExcluirClienteDomiciliar(int selectedRow)");
        excluirClienteDomiciliar(janFormularioClienteDomiciliar.getListClienteDomiciliar().get(selectedRow));
        janFormularioClienteDomiciliar.getListClienteDomiciliar().remove(selectedRow);
    }

    /**
     * Abre a janela de formulario do cliente para incluir um novo cliente
     */
    public void abrirIncluirFormularioClienteDomiciliar() {
        System.out.println("CtrlCliente - abrirIncluirFormularioClienteDomiciliar()");
        janFormularioClienteDomiciliar.setMODO(tipo.INCLUIR);
        janFormularioClienteDomiciliar.acaoIncluir();
        janFormularioClienteDomiciliar.setVisible(true);
    }
    
    /**
     * Abre a janela de formulario do cliente para alterar um cliente
     * @param linhaSelecionada 
     */
    public void abrirAlterarFormularioClienteDomiciliar(int linhaSelecionada) {
        System.out.println("CtrlCliente - abrirAlterarFormularioClienteDomiciliar(int linhaSelecionada)");
        janFormularioClienteDomiciliar.setMODO(tipo.ALTERAR);
        janFormularioClienteDomiciliar.acaoAlterar(linhaSelecionada);
        janFormularioClienteDomiciliar.setVisible(true);
    }
    
    /**
     * Abre a janela de formulario do cliente pra consultar um cliente
     * @param linhaSelecionada 
     */
    public void abrirConsultarFormularioClienteDomiciliar(int linhaSelecionada) {
        System.out.println("CtrlCliente - abrirConsultarFormularioClienteDomiciliar(int linhaSelecionada)");
        janFormularioClienteDomiciliar.acaoConsultar(linhaSelecionada);
        janFormularioClienteDomiciliar.setVisible(true); 
    }
    
    /**
     * Atuliza a lista de clientes domicliares presente na janela de eventos do clienteDomicliar
     * @param t
     * @param qtd 
     */
    public void dadosClienteDomiciliar(TableModel t, int qtd) {
        for (int i = 0; i < qtd; i++) {
            ((DefaultTableModel) t).removeRow(0);
        }

        try {
            System.out.println("CtrlCliente - dadosClienteDomiciliar(TableModel t, int qtd)");
            janFormularioClienteDomiciliar.setListClienteDomiciliar(obterClienteDomiciliares());
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
        if (janFormularioClienteDomiciliar.getListClienteDomiciliar() != null) {
            for (ClienteDomiciliar c : janFormularioClienteDomiciliar.getListClienteDomiciliar()) {
                Integer num;
                if(c.getPedido()==null)
                {
                    num = 0;
                }
                else
                {
                    num = 1;
                }
                ((DefaultTableModel) t).addRow(new Object[]{c.getNome(), c.getSituacao().toString(),num.toString()});
            }
        }
    }
    
    
    
    /**
     * Atuliza a lista de clientes (mesa e clientes domiciliares) presente na janela de relatorio dos clientes
     * @param t
     * @param qtd
     * @param tipo 
     */
    public void dadosClientes(TableModel t, int qtd, String tipo) {
        System.out.println("CtrlCliente - dadosCliente(TableModel t, int qtd,String tipo)");
        Integer num;
        List<ClienteDomiciliar> clientes = null;
        List<Mesa> mesas = null;
        List<Pedinte> pedintes = new ArrayList<>();
        for (int i = 0; i < qtd; i++) {
            ((DefaultTableModel) t).removeRow(0);
        }

        try {
            clientes = obterClienteDomiciliares();
            mesas = obterMesas();
            
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
        if(tipo.equals("TODOS"))
        {
            if (clientes != null) {
                for (ClienteDomiciliar c : clientes) {
                    if(c.getPedido()==null)
                    {
                        num = 0;
                    }
                    else
                    {
                        num = 1;
                    }
                    ((DefaultTableModel) t).addRow(new Object[]{c.getNome(), c.getSituacao(),num.toString(),"CLIENTE DOMICILIAR"});
                }
            }
            if (mesas != null) {
                for (Mesa m : mesas) {
                    num = m.getPedidosEspera().size();
                    ((DefaultTableModel) t).addRow(new Object[]{m.getNumero(),m.getSituacao(),num.toString(),"MESA"});
                }
            }
            pedintes.addAll(clientes);
            pedintes.addAll(mesas);
        }
        if(tipo.equals("CLIENTE DOMICILIAR"))
        {
            if (clientes != null) {
                for (ClienteDomiciliar c : clientes) {
                    if(c.getPedido()==null)
                    {
                        num = 0;
                    }
                    else
                    {
                        num = 1;
                    }
                    ((DefaultTableModel) t).addRow(new Object[]{c.getNome(), c.getSituacao(),num.toString(),"CLIENTE DOMICILIAR"});
                }
            }
            pedintes.addAll(clientes);
        }
        if(tipo.equals("MESA"))
        {
            if (mesas != null) {
                for (Mesa m : mesas) {
                    num = m.getPedidosEspera().size();
                    ((DefaultTableModel) t).addRow(new Object[]{m.getNumero(),m.getSituacao(),num.toString(),"MESA"});
                }
            }
            pedintes.addAll(mesas);
        }
        janRelatorioCliente.setCliente(pedintes);
    }
    
    /**
     * Abre a janela de formulario do cliente pra consultar um cliente (mesa ou cliente domiciliar)
     * @param linhaSelecionada 
     */
    public void abrirConsultarFormularioCliente(int linhaSelecionada) {
        System.out.println("CtrlCliente - abrirConsultarFormularioCliente(int linhaSelecionada)");
        if(janRelatorioCliente.getCliente().get(linhaSelecionada) instanceof Mesa)
        {
            Mesa m = (Mesa) janRelatorioCliente.getCliente().get(linhaSelecionada);
                    
            janFormularioMesa.montarTela(m);
            janFormularioMesa.arrumarTela(false);
            janFormularioMesa.jButton1.setVisible(false);
            janFormularioMesa.setVisible(true);
        }
        else
        {
            ClienteDomiciliar c = (ClienteDomiciliar) janRelatorioCliente.getCliente().get(linhaSelecionada);
                    
            janFormularioClienteDomiciliar.montarTela(c);
            janFormularioClienteDomiciliar.arrumarTela(false);
            janFormularioClienteDomiciliar.jButton1.setVisible(false);
            janFormularioClienteDomiciliar.setVisible(true);
        }
    }
    
}
